package dou.net.socket;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;

/**
 * 定义了套接字解包的基础方法
 * @author wizardc
 */
public interface IPacketBuffer
{
    /**
     * 读取数据并解析数据为一个协议包
     * @param channel 可以读取数据的通道对象
     * @return 读取的数据字节大小
     * @throws IOException 无法读取数据时抛出该异常
     * @throws InvalidProtocolException 协议数据错误时抛出该异常
     */
    int readFrom(ReadableByteChannel channel) throws IOException, InvalidProtocolException;

    /**
     * 获取该协议包还需要等待接收的字节大小
     * @return 该协议包还需要等待接收的字节大小，如果该协议包已经接收完毕则返回 0
     */
    int remaining();

    /**
     * 将该协议包对象转换为对应的字节缓冲对象
     * @return 该协议包对应的字节缓冲对象
     */
    ByteBuffer toByteBuffer();
}
